#!/bin/bash

# 自动部署脚本 - 无需外部配置文件
# 使用示例：sh auto_deploy.sh start
# 支持操作：start|stop|restart|status|log|setup-logrotate

# 配置参数
APP_HOME="/xxx/xxx/xxx"
JAR_NAME="xxx.jar"
JAR_FILE="${APP_HOME}/${JAR_NAME}"

LOG_DIR="${APP_HOME}/log"
LOG_NAME="xxx.log"
LOG_FILE="${LOG_DIR}/${LOG_NAME}"
ERROR_LOG_FILE="${LOG_DIR}/error.log"  # 错误日志单独存放
EXP="--spring.profiles.active=pro"
# 确保日志目录存在
mkdir -p "$LOG_DIR"

# 检查是否提供了操作参数
if [ $# -lt 1 ]; then
    echo "用法: $0 [start|stop|restart|status|log|setup-logrotate]"
    echo "示例: $0 start"
    exit 1
fi

ACTION="$1"

# 启动方法 - 修改为分离错误日志
start() {
    pid=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
    if [ -z "$pid" ]; then
         # 将标准错误输出重定向到单独的错误日志
         nohup java -jar "$JAR_FILE" $EXP > "$LOG_FILE" 2>"$ERROR_LOG_FILE" &
        pid=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
        echo "服务 ${JAR_FILE} 启动中！pid=${pid}"
        echo "查看日志："
		tail -f $LOG_FILE
    else
        echo "服务已运行，pid = ${pid}。如需重启，请使用 restart 命令。"
    fi
}

# 停止方法
stop() {
    pid=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
    if [ -z "$pid" ]; then
        echo "服务未运行，无需停止！"
    else
        kill -9 "$pid"
        echo "服务停止成功！pid:${pid} 已强制终止。"
    fi
}

# 状态检查
status() {
    pid=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
    if [ -z "$pid" ]; then
        echo "服务未运行！"
    else
        echo "服务运行中，pid=${pid}"
    fi
}

# 重启方法
restart() {
    echo "正在重启服务...";
    stop
    # 短暂延迟确保进程已终止
    sleep 2
    start
    echo "服务重启成功！"
}

# 查看日志方法
log() {
    if [ -f "$LOG_FILE" ]; then
        echo "日志文件位置：$LOG_FILE"
        echo "显示最后10行日志并实时跟踪更新："
        tail -10f "$LOG_FILE"
    else
        echo "日志文件不存在：$LOG_FILE"
    fi
}

# 查看错误日志方法
errorlog() {
    if [ -f "$ERROR_LOG_FILE" ]; then
        echo "错误日志文件位置：$ERROR_LOG_FILE"
        echo "显示最后10行错误日志并实时跟踪更新："
        tail -10f "$ERROR_LOG_FILE"
    else
        echo "错误日志文件不存在：$ERROR_LOG_FILE"
    fi
}

# 配置日志切割
setup_logrotate() {
    # 创建logrotate配置文件
    LOGROTATE_CONF="/etc/logrotate.d/${JAR_NAME%.jar}"
    
    echo "正在配置日志切割，配置文件：$LOGROTATE_CONF"
    
    # 写入logrotate配置
    cat << EOF | sudo tee "$LOGROTATE_CONF" > /dev/null
$LOG_FILE
$ERROR_LOG_FILE {
    daily                # 按天切割
    rotate 30            # 保留30天的日志
    missingok            # 日志文件不存在也不报错
    compress             # 压缩旧日志
    delaycompress        # 延迟压缩（不压缩最近的一个）
    notifempty           # 空日志不切割
    create 0644 root root # 创建新日志文件的权限和所有者
    sharedscripts        # 所有日志文件切割完成后只执行一次脚本
    postrotate
        # 切割后不需要重启服务，因为日志是追加模式
        echo "日志切割完成: \$(date)" >> $LOG_DIR/logrotate.log
    endscript
}
EOF

    # 检查配置是否成功
    if [ $? -eq 0 ]; then
        echo "日志切割配置成功！"
        echo "配置内容："
        cat "$LOGROTATE_CONF"
        echo "可以手动测试切割：sudo logrotate -f $LOGROTATE_CONF"
    else
        echo "日志切割配置失败！"
        exit 1
    fi
}

# 执行对应操作
case "$ACTION" in
    start|stop|restart|status|log|errorlog|setup_logrotate)
        ${ACTION//-/_}  # 将横线转换为下划线以匹配函数名
        ;;
    *)
        echo "未知操作: $ACTION"
        echo "支持的操作: start|stop|restart|status|log|errorlog|setup_logrotate"
        exit 1
        ;;
esac
